package com.wcs.exam.controller.biz;

import com.wcs.exam.common.base.BaseBiz;
import com.wcs.exam.common.server.pay.util.AliPayConfig;
import com.wcs.exam.common.server.pay.util.WxPayConfig;
import com.wcs.exam.common.util.BeanUtil;
import com.wcs.exam.common.util.RsaUtil;
import com.wcs.exam.controller.biz.resp.LoginConfigResp;
import com.wcs.exam.controller.biz.resp.SysConfigFaceResp;
import com.wcs.exam.controller.biz.resp.SysConfigPayResp;
import com.wcs.exam.controller.biz.resp.SysConfigUploadResp;
import com.wcs.exam.dao.SysConfigDao;
import com.wcs.exam.dao.impl.mapper.entity.SysConfig;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * @author wcs
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class SysConfigCommonBiz extends BaseBiz {

    private static final String PRIVATE_KEY = "private:key";

    @NotNull
    private final SysConfigDao dao;

    public <T> T getSysConfig(Class<T> clazz) {
        Map<String, String> map = dao.list().stream().collect(Collectors.toMap(SysConfig::getConfigKey, SysConfig::getConfigValue));
        return BeanUtil.objToBean(map, clazz);
    }

    /**
     * 解密，用户登录密码
     */
    public String decrypt(String password) {
        String privateKey = cacheRedis.get(PRIVATE_KEY);
        if (!StringUtils.hasText(privateKey)) {
            privateKey = getSysConfig(LoginConfigResp.class).getRsaLoginPrivateKey();
            cacheRedis.set(PRIVATE_KEY, privateKey, 1, TimeUnit.DAYS);
        }
        return RsaUtil.decrypt(password, privateKey);
    }

    public SysConfigFaceResp getFace() {
        return getSysConfig(SysConfigFaceResp.class);
    }

    public SysConfigUploadResp getUpload() {
        return getSysConfig(SysConfigUploadResp.class);
    }

    public SysConfigPayResp getPay() {
        Map<String, String> map = dao.list().stream().collect(Collectors.toMap(SysConfig::getConfigKey, SysConfig::getConfigValue));
        SysConfigPayResp payConfig = BeanUtil.objToBean(map, SysConfigPayResp.class);
        payConfig.setAliPayConfig(BeanUtil.objToBean(map, AliPayConfig.class));
        payConfig.setWxPayConfig(BeanUtil.objToBean(map, WxPayConfig.class));
        return payConfig;
    }

}
